/*
 * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 */

/*
 *
 *
 *
 *
 *
 * Written by Doug Lea with assistance from members of JCP JSR-166
 * Expert Group and released to the public domain, as explained at
 * http://creativecommons.org/publicdomain/zero/1.0/
 */

package java.util.concurrent.locks;

/**
 * 读写锁,一个是只读的锁，一个是写锁。读锁可以在没有写锁的时候被多个线程同时持有，写锁是独占的。
 * 1、读读共享
 * 2、读写互斥
 * 3、写写互斥

 *  读写锁比互斥锁允许对于共享数据更大程度的并发。
 *  每次只能有一个写线程，但是同时可以有多个线程并发地读数据。
 *  ReadWriteLock适用于读多写少的并发情况。
 *  ReetrantReadWriteLock读写锁的实现中，需要注意的，当有读锁时，写锁就不能获得；
 *  而当有写锁时，除了获得写锁的这个线程可以获得读锁外，其他线程不能获得读锁

 * 读写锁的三个重要特性
 * 1、公平选择性: 支持非公平(默认)和公平的锁获取方式,吞吐量还是非公平优于公平
 * 2、重进入: 读锁和写锁都支持线程重进入
 * 3、锁降级: 遵循获取写锁、获取读锁再释放写锁的次序,写锁能够降级成读锁
 */
public interface ReadWriteLock {

    /*
     * 获取锁顺序
     * 非公平模式（默认）,当以非公平初始化时，读锁和写锁的获取的顺序是不确定的。非公平锁主张竞争获取，可能会延缓一个或多个读或写线程，但是会比公平锁有更高的吞吐量。
     * 公平模式,当以公平模式初始化时，线程将会以队列的顺序获取锁。在当前线程释放锁后，等待时间最长的写锁线程就会被分配写锁；或者有一组读线程组等待时间比写线程长，那么这组读线程组将会被分配读锁。
     */

    /**
     * 返回用于读取的锁
     */
    Lock readLock();

    /**
     * 返回用于写入的锁。
     */
    Lock writeLock();


}
